
import java.util.ArrayList;
import java.util.List;

/**
 * M个数中选N个组合
 * 
 * @author Everest
 *
 */
public class MselectN {
	private static char[] is = new char[] { '1', '2','3'};
	private static int total;
	private static int m = 3;

	public static void main(String[] args) {
//		int start = TimeProcesser.getUnixTime();
//		List<Integer> iL = new ArrayList<Integer>();
//		new MselectN().plzh("", iL, m);
//		System.out.println("total : " + total);
//		System.out.println(TimeProcesser.getUnixTime() - start);
		
		Combination combination = new Combination(6, 9);
		int[] one = null;
		while ((one = combination.next()) != null) {
			for (int i = 0; i < one.length; i++) {
				System.out.print(is[one[i]]);
			}
			System.out.println();
		}
	}

	private void plzh(String s, List<Integer> iL, int m) {
		if (m == 0) {
			System.out.println(s);
			total++;
			return;
		}
		List<Integer> iL2;
		for (int i = 0; i < is.length; i++) {
			iL2 = new ArrayList<Integer>();
			iL2.addAll(iL);
			if (!iL.contains(i)) {
				String str = s + is[i];
				iL2.add(i);
				plzh(str, iL2, m - 1);
			}
		}
	}
}

class Combination {
	int n, m;
	int[] pre = {1, 2, 3 , 4, 5, 6, 7, 8, 9};// previous combination.

	public Combination(int n, int m) {
		this.n = n;
		this.m = m;
	}

	/** * 取下一个组合。可避免一次性返回所有的组合(数量巨大，浪费资源)。 * if return null,所有组合均已取完。 */
	public int[] next() {
		if (pre == null) {
			// 取第一个组合，以后的所有组合都经上一个组合变化而来。
			pre = new int[n];
			for (int i = 0; i < pre.length; i++) {
				pre[i] = i;
			}
			int[] ret = new int[n];
			System.arraycopy(pre, 0, ret, 0, n);
			return ret;
		}
		int ni = n - 1, maxNi = m - 1;
		while (pre[ni] + 1 > maxNi) {
			// 从右至左，找到有增量空间的位。
			ni--;
			maxNi--;
			if (ni < 0)
				return null;
			// 若未找到，说明了所有的组合均已取完。
		}
		pre[ni]++;
		while (++ni < n) {
			pre[ni] = pre[ni - 1] + 1;
		}
		int[] ret = new int[n];
		System.arraycopy(pre, 0, ret, 0, n);
		return ret;

	}
}